package Proxy;

// 文件读取接口
public interface FileReader {
    String readFile(String filename);
}

// 真实文件读取器
class RealFileReader implements FileReader {
    @Override
    public String readFile(String filename) {
        System.out.println("正在读取文件: " + filename);
        // 模拟实际读取操作
        return "文件内容: " + filename;
    }
}

// 代理类（控制对RealFileReader的访问）
class FileReaderProxy implements FileReader {
    private RealFileReader realFileReader;
    private String currentUser;

    public FileReaderProxy(String user) {
        this.currentUser = user;
    }

    @Override
    public String readFile(String filename) {
        // 1. 权限检查
        if (!"admin".equals(currentUser)) {
            throw new RuntimeException("无权限访问文件！");
        }

        // 2. 延迟初始化真实对象
        if (realFileReader == null) {
            realFileReader = new RealFileReader();
        }

        // 3. 记录日志
        System.out.println("用户 " + currentUser + " 访问了文件: " + filename);

        // 4. 调用真实对象的方法
        return realFileReader.readFile(filename);
    }
}

class Client {
    public static void main(String[] args) {
        // 使用代理访问文件
        FileReader proxy = new FileReaderProxy("admin");
        System.out.println(proxy.readFile("secret.txt")); // 成功访问

        FileReader invalidProxy = new FileReaderProxy("guest");
        System.out.println(invalidProxy.readFile("secret.txt")); // 抛出权限异常
    }
}
